數據持久性( Data Persistence ) 是將任何類型的數據存儲到本地端的機制,在本地存儲數據的能力,以便使用者下次打開應用程序時可以使用相同的數據而不會更改,接下來將介紹幾種最常見的數據存儲方式。參考文件
讓我們從數據存儲中最簡單的 UserDefaults 開始, UserDefaults 用作鍵值存儲, 有特定的方法來檢索精確的數據類型(bool(forKey:)、int(forKey:) 等)和 object(forKey) 來檢索 Any
UserDefaults 是一個 NSObject 子類,它為我們提供了同步讀取和寫入(在緩存級別)和異步持久化級別。
class UserRepository {
    enum Key: String, CaseIterable {
        case name, avatarData
        func make(for userID: String) -> String {
            return self.rawValue + "_" + userID
        }
    }
    let userDefaults: UserDefaults
    // MARK: - Lifecycle
    init(userDefaults: UserDefaults = .standard) {
        self.userDefaults = userDefaults
    }
    // MARK: - API
    func storeInfo(forUserID userID: String, name: String, avatarData: Data) {
        saveValue(forKey: .name, value: name, userID: userID)
        saveValue(forKey: .avatarData, value: avatarData, userID: userID)
    }
    
    func getUserInfo(forUserID userID: String) -> (name: String?, avatarData: Data?) {
        let name: String? = readValue(forKey: .name, userID: userID)
        let avatarData: Data? = readValue(forKey: .avatarData, userID: userID)
        return (name, avatarData)
    }
    
    func removeUserInfo(forUserID userID: String) {
        Key
            .allCases
            .map { $0.make(for: userID) }
            .forEach { key in
                userDefaults.removeObject(forKey: key)
        }
    }
    // MARK: - Private
    private func saveValue(forKey key: Key, value: Any, userID: String) {
        userDefaults.set(value, forKey: key.make(for: userID))
    }
    private func readValue<T>(forKey key: Key, userID: String) -> T? {
        return userDefaults.value(forKey: key.make(for: userID)) as? T
    }
}
建議使用 UserDefaults 來存儲用戶的偏好。 我們應該用它來存儲較零碎的訊息(例如,用戶是喜歡亮模式還是暗模式,他們想在什麼時間收到每日提醒,他們是否真的想收到通知等)